#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 创建菜单栏
    //QMenuBar* menuBar = new QMenuBar();
    // 如果自动生成ui文件，会自动创建一个MenuBar，再创建一个之后会替换之前的，导致之前的没有挂到对树上，无法销毁，内存泄漏
    // 所以通过下面的方式创建，如果存在就用现在的，不存在则创建一个
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);// 只能有一个菜单栏，所以用set
    // 创建菜单
    QMenu* menu1 = new QMenu("文件(&F)");// 取地址加字符添加快捷键
    QMenu* menu2 = new QMenu("编辑(&E)");
    QMenu* menu3 = new QMenu("工具(&T)");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);
    // 添加菜单项
    QMenu* menu1son = new QMenu("新建(&N)");
    QAction* action1 = new QAction("打开(&O)");
    QAction* action2 = new QAction("保存(&S)");
    QAction* action3 = new QAction("退出(&Q)");
    QAction* action4 = new QAction("新建项目");
    QAction* action5 = new QAction("新建文件");
    menu1->addAction(action1);
    // 添加分隔线
    menu1->addSeparator();
    menu1->addAction(action2);
    menu1->addSeparator();
    menu1->addAction(action3);
    menu1->addSeparator();
    // 添加子菜单
    menu1->addMenu(menu1son);
    menu1son->addAction(action4);
    menu1son->addAction(action5);
    // 给菜单项添加槽函数
    connect(action1, &QAction::triggered, this, &MainWindow::newFile);

    // 给菜单项添加图标
    action2->setIcon(QIcon(":/save.png"));
    action3->setIcon(QIcon(":/exit.png"));// 菜单栏和工具栏的图标会覆盖文字,但会以ToolTip形式展示
    action4->setIcon(QIcon(":/files.png"));// 菜单项的图标不会覆盖文字
    action5->setIcon(QIcon(":/file.png"));

    // 添加工具栏
    QToolBar* toolBar1 = new QToolBar();
    QToolBar* toolBar2 = new QToolBar();
    this->addToolBar(toolBar1);
    toolBar1->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea);// 只能停靠在上下
    this->addToolBar(Qt::LeftToolBarArea, toolBar2);// 设置初始停靠位置
    toolBar1->setFloatable(false);// 不可浮动
    toolBar2->setMovable(false);// 不可移动
    toolBar1->addAction(action2);
    toolBar1->addAction(action3);
    toolBar2->addAction(action4);
    toolBar2->addAction(action5);
    action2->setToolTip("保存文件");

    // 添加状态栏
    QStatusBar* statusBar = this->statusBar();
    this->setStatusBar(statusBar);

    // statusBar->showMessage("这是一个状态栏", 3000);// 临时消息，设置3秒后消失

    QLabel* label1 = new QLabel("这是左边的QLabel");
    QLabel* label2 = new QLabel("这是右边的QLabel");
    QProgressBar* progressBar = new QProgressBar();
    progressBar->setRange(0, 100);
    progressBar->setValue(50);

    statusBar->addWidget(label1);
    statusBar->addPermanentWidget(label2);// 从有往左添加
    statusBar->addWidget(progressBar);

    // 添加子窗口
    QDockWidget* dockWidget = new QDockWidget();
    this->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
    dockWidget->setWindowTitle("这是子窗口");

    // 如果要给子窗口添加控件，不能直接添加，而是要创建一个Widget，将要添加的控件加到Wideget中，然后将Widget放到这个子窗口中
    QWidget* container = new QWidget();
    dockWidget->setWidget(container);
    // 添加一个垂直布局管理器
    QVBoxLayout* vlayout = new QVBoxLayout();
    container->setLayout(vlayout);

    QPushButton* button1 = new QPushButton("自定义对话框");
    QPushButton* button2 = new QPushButton("消息提示对话框");
    QPushButton* button3 = new QPushButton("颜色对话框");
    QPushButton* button4 = new QPushButton("打开、保存文件对话框");
    button5 = new QPushButton("字体对话框");
    QPushButton* button6 = new QPushButton("输入对话框");
    vlayout->addWidget(button1);
    vlayout->addWidget(button2);
    vlayout->addWidget(button3);
    vlayout->addWidget(button4);
    vlayout->addWidget(button5);
    vlayout->addWidget(button6);

    // 添加对话框，点击按钮后弹出对话框
    // QDialog、自定义Dialog、图形化界面
    connect(button1, &QPushButton::clicked, this, &MainWindow::button_handle1);
    // 内置QMessageBox
    connect(button2, &QPushButton::clicked, this, &MainWindow::button_handle2);
    // 内置QColorDialog
    connect(button3, &QPushButton::clicked, this, &MainWindow::button_handle3);
    // 内置QFileDialog
    connect(button4, &QPushButton::clicked, this, &MainWindow::button_handle4);
    // 内置QFontDialog
    connect(button5, &QPushButton::clicked, this, &MainWindow::button_handle5);
    // 内置QInputDialog
    connect(button6, &QPushButton::clicked, this, &MainWindow::button_handle6);


}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::newFile()
{
    qDebug() << "执行新建操作";
}

void MainWindow::button_handle1()
{
//    QDialog* dialog = new QDialog();
//    dialog->setWindowTitle("对话框");

//    dialog->resize(400, 300);
//    // 通过show显示对话框
//    dialog->show();

//    //但是如果用户创建很多dialog，就会引起内存泄漏，所以要及时销毁，点关闭按钮就销毁
//    dialog->setAttribute(Qt::WA_DeleteOnClose);

    // 使用自己创建的类
    // 首先新建文件，新建C++ -> C++ Class -> 填写类名和继承的父类名 -> 创建
    Dialog* dialog = new Dialog(this);
    dialog->resize(400, 300);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    // 设置 模态/非模态
    // 模态：弹出对话框时，无法操作无窗口，必须完成对话框操作才能操作父窗口
    //dialog->show();// 非模态方式显示
    dialog->exec();// 模态方式显示

    // 通过图形化界面创建
    // 首先新建文件，新建Qt -> Qt设计师界面类 -> 选择一个合适的Dialog创建，就多了一个ui文件，就可以创建了

}

void MainWindow::button_handle2()
{
//    QMessageBox* messageBox = new QMessageBox(this);
//    messageBox->resize(400, 300);
//    messageBox->setAttribute(Qt::WA_DeleteOnClose);

//    messageBox->setWindowTitle("消息对话框");
//    messageBox->setText("这是对话框的提示信息");
//    messageBox->setIcon(QMessageBox::Warning);
//    messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);// 设置对话框按钮

    // 一步到位生成对话框
    int result = QMessageBox::warning(this, "对话框标题", "对话框的内容", QMessageBox::Ok | QMessageBox:: Cancel);
    if(result == QMessageBox::Ok)
        qDebug() << "ok";
    if(result == QMessageBox::Save)
        qDebug() << "save";
    if(result == QMessageBox::Cancel)
        qDebug() << "cancel";

    // 自定义按钮
//    QPushButton* button = new QPushButton("按钮", messageBox);
//    messageBox->addButton(button, QMessageBox::AcceptRole);

//    // 也可以通过信号槽处理按钮，但是不好用
//    int result = messageBox->exec();
//    if(result == QMessageBox::Ok)
//        qDebug() << "ok";
//    if(result == QMessageBox::Save)
//        qDebug() << "save";
//    if(result == QMessageBox::Cancel)
//        qDebug() << "cancel";
}

void MainWindow::button_handle3()
{
    // 不需要手动创建对话框，内置的方法就能自动创建对话框
    QColor color = QColorDialog::getColor(QColor(0, 0, 255), this, "选择颜色");
    qDebug() << color;

//    QString style = "background-color: rgb(" + QString::number(color.red()) + "," + QString::number(color.green())
//            + "," +QString::number(color.blue()) +");";

    char style[1024] = {};
    sprintf(style, "background-color: rgb(%d, %d, %d)", color.red(), color.green(), color.blue());
    this->setStyleSheet(style);
}

void MainWindow::button_handle4()
{
    QString filePath = QFileDialog::getOpenFileName(this);// 可以添加参数，选择文件后缀
    qDebug() << "打开文件地址" << filePath;

//    QString filePath1 = QFileDialog::getSaveFileName(this);
//    qDebug() << "打开文件地址" << filePath1;
}

void MainWindow::button_handle5()
{
    bool ok = false;
    QFont font = QFontDialog::getFont(&ok);
    qDebug() << font << ok;
    qDebug() << font.family();
    qDebug() << font.pointSize();
    qDebug() << font.bold();
    qDebug() << font.italic();

    button5->setFont(font);
}

void MainWindow::button_handle6()
{
//    int result = QInputDialog::getInt(this,"输入整数对话框","输入一个整数");

//    double result = QInputDialog::getDouble(this,"输入浮点数对话框","输入一个浮点数");

    QStringList items;
    items.push_back("111");
    items.push_back("222");
    items.push_back("333");
    items.push_back("444");
    QString result = QInputDialog::getItem(this,"输入条目对话框","输入一个条目",items);// 类似于下拉框
    qDebug() << result;
}

